package org.common.utils.database.access;

import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;

import javax.sql.DataSource;

/**
 * 数据源工具
 * @author zhouzhibing
 * @date 2025/4/3
 */
public class DataSourceTool {

    /**
     * cpu数量
     */
    private static final int CPU_COUNT = Runtime.getRuntime().availableProcessors();

    /**
     * 新建hikari数据源
     * @param host 数据库地址 地址:端口/数据库名
     * @param username 用户名
     * @param password 密码
     * @return 数据源
     */
    public static DataSource newHikariDataSourceByHost(String host , String username , String password) {
        String url = "jdbc:mysql://%s?characterEncoding=utf8".formatted(host);
        return newHikariDataSource(url , username , password , 1 , CPU_COUNT);
    }

    /**
     * 新建hikari数据源
     * @param host 数据库地址 地址:端口/数据库名
     * @param username 用户名
     * @param password 密码
     * @param minPoolSize 最小连接池数量
     * @param maxPoolSize 最大连接池数量
     * @return 数据源
     */
    public static DataSource newHikariDataSourceByHost(String host , String username , String password, int minPoolSize , int maxPoolSize) {
        String url = "jdbc:mysql://%s?characterEncoding=utf8".formatted(host);
        return newHikariDataSource(url , username , password , minPoolSize , maxPoolSize);
    }


    /**
     * 新建hikari数据源
     * @param url 数据库地址  jdbc:mysql://xxxxxxxx?characterEncoding=utf8
     * @param username 用户名
     * @param password 密码
     * @return 数据源
     */
    public static DataSource newHikariDataSource(String url , String username , String password) {
        return newHikariDataSource(url , username , password , 1 , CPU_COUNT);
    }

    /**
     * 新建hikari数据源
     * @param url 数据库地址
     * @param username 用户名
     * @param password 密码
     * @param minPoolSize 最小连接池数量
     * @param maxPoolSize 最大连接池数量
     * @return 数据源
     */
    public static DataSource newHikariDataSource(String url , String username , String password , int minPoolSize , int maxPoolSize) {
        HikariConfig hikariConfig = new HikariConfig();
        hikariConfig.setJdbcUrl(url);
        hikariConfig.setUsername(username);
        hikariConfig.setPassword(password);
        hikariConfig.setMinimumIdle(minPoolSize);
        hikariConfig.setMaximumPoolSize(maxPoolSize);
        hikariConfig.setConnectionTimeout(10000);
        hikariConfig.setIdleTimeout(600000);
        return new HikariDataSource(hikariConfig);
    }
}
